import requests
import threading
import unittest
import json
import setup_common
import csv
import random
import os
import logging

# 设置日志格式和级别
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s [%(threadName)s] %(message)s')


class AsnTest(unittest.TestCase):
    def setUp(self):
        # 获取一些配置信息
        self.ip = setup_common.get_shared_ip()  # 获取共享 IP 地址
        self.detailturl = setup_common.generate_url(self.ip, "asn/detail")  # 生成 ASN 详情的 URL
        self.stockurl = setup_common.generate_url(self.ip, "asn/movetobin")  # 生成移库的 URL
        self.headers = setup_common.get_shared_headers()  # 获取共享请求头
        self.asn_list = []  # 存储 ASN 数据的列表

        # 从 CSV 文件中读取库位名称列表
        self.bin_names = self.read_bin_names_from_csv("stock_list.csv")

    def get_asn_list(self):
        page = 1
        while True:
            # 发送 GET 请求以获取 ASN 数据
            response = requests.get(url=self.detailturl, headers=self.headers, params={"asn_status": 4, "page": page})
            if response.status_code == 200:
                data = response.json()
                asn_res = data.get('results', [])
                self.count = data.get('count', 0)  # 获取 ASN 数据总数
                self.asn_status = data.get('asn_status', 4)  # 获取 ASN 状态
                # 在这里添加一个计数器
                loop_count = 0
                print(f"总共有{self.count}条数据")

                if self.count == 0:
                    break

                # 迭代 asn_res 列表
                for item in asn_res:
                    # 如果 goods_qty 等于 sorted_qty，则跳出当前循环，处理下一个 item
                    if item['goods_qty'] == item["sorted_qty"]:
                        continue

                    # 生成 ASN 分拣数据的生成器
                    while loop_count < self.count:
                        # 定义条件和对应的 'qty' 值的字典
                        # 计算 qty
                        difference = item["goods_qty"] - item["sorted_qty"]
                        if difference < 20:
                            qty = difference  # 满足条件 1
                        elif 100 <= difference <= 999:
                            qty = 20  # 满足条件 2
                        else:
                            qty = 10  # 其他情况

                        yield {
                            "id": item['id'],
                            "bin_name": random.choice(self.bin_names),  # 随机选择库位名称
                            "asn_code": item['asn_code'],
                            "supplier": item["supplier"],
                            "goods_desc": item["goods_desc"],
                            "goods_code": item["goods_code"],
                            "goods_qty": item["goods_qty"],
                            'qty': qty

                        }
                        # 检查下一个 item 是否与当前的 asn_code 相同
                        if not asn_res or asn_res[0]['asn_code'] != item['asn_code']:
                            continue  # 如果不同，跳入下一个循环
                        else:
                            item = asn_res[0]  # 如果相同，继续处理下一个 item

                        page += 1
                        # 在每次请求后更新 self.count 的值
                        self.count -= 1  # 这里应该减1，因为只处理一个 item
                        print(f"到货通知书编写为:{item['asn_code']}")
                        print(f"实际到货数量为:{item['goods_qty']}")

                        print(f"final 最终要移库的数据为:{qty}")


            else:
                print(f"请求失败，状态码为：{response.status_code}")

    def read_bin_names_from_csv(self, csv_filename):
        bin_names = []
        with open(csv_filename, "r") as csv_file:
            csv_reader = csv.reader(csv_file)
            next(csv_reader)  # 跳过标题行
            for row in csv_reader:
                bin_name = row[1]  # 假设库位名称在第二列
                bin_names.append(bin_name)
        return bin_names

    def test_move_stock(self):
        # 构建移库数据
        move_qty_generator = self.get_asn_list()
        for idx, move_qty in enumerate(move_qty_generator, start=1):
            id_use = move_qty["id"]
            stockurl = f'{self.stockurl}{id_use}/'
            print(f"移库数据 {idx}:")
            print(move_qty)
            print(stockurl)

            # 发送 POST 请求以移库
            response = requests.post(url=stockurl, headers=self.headers, json=move_qty).text
            print(f"{threading.current_thread().name} - 处理中: {response}")
            print(f"{threading.current_thread().name} - 移库数据量:{move_qty['qty']}")

            # 检查是否还有数据，如果没有则停止循环
            if self.count == 0:
                print("没有更多的ASN数据，停止循环")
                break


if __name__ == '__main':
    unittest.main()
